<!--
 * @Author: weidewei
 * @Date: 2025-11-10 09:34:04
 * @LastEditors: weidewei
 * @LastEditTime: 2025-11-10 17:50:22
 * @Description: 
 * @FilePath: \2025-front-face\review-knowledge\20251110\复习手写promise静态方法.html
-->
<script>
  function isPromise(obj) {
    return typeof obj?.then === "function";
  }
  /**
   * 1.接收一个可迭代对象
   * 2.返回一个新的promise
   * 3.初始化结果数组和计数器
   * 4.遍历处理每个 Promise
   * 5.处理完成条件
   * 6.保持结果顺序
   */
  // Promise.all = function (proms) {
  //   return new Promise((resolve, reject) => {
  //     try {
  //       const result = [];
  //       let count = 0;
  //       let finishCount = 0;
  //       for (const p of proms) {
  //         let index = count;
  //         count++;
  //         Promise.resolve(p).then((data) => {
  //           result[index] = data;
  //           finishCount++;
  //           // 说明已经是最后一个promise了
  //           if (finishCount === count) {
  //             resolve(result);
  //           }
  //         }, reject);
  //       }
  //       if (count === 0) {
  //         resolve(result);
  //       }
  //     } catch (err) {
  //       reject(err);
  //       console.log(err);
  //     }
  //   });
  // };
  // // const p1 = Promise.resolve(new Promise((resolve,reject)=>{
  // //     resolve(999);
  // // }));
  // const p1 = new Promise((resolve,reject)=>{
  //   setTimeout(()=>{
  //       resolve(999);
  //   },2000)
  // })
  // const p2 = Promise.resolve(2);
  // const p3 = Promise.resolve(3);
  // // 测试
  // Promise.all([p1, p2, p3]).then((data) => {
  //   console.log(data)
  // }).catch(err=>{
  //   console.log('err',err)
  // });

  /** 返回一个已完成的promise
   *  1. 传递的data本身就是ES6的Promise对象
   *  2. 传递的data是PromiseLike（Promise A+），返回新的Promise，状态和其保持一致即可
   */
  // Promise.resolve = function (data) {
  //   if (data instanceof Promise) return data;
  //   return new Promise((resolve,reject)=>{
  //     if(isPromise(data)) {
  //       data.then(resolve,reject);
  //     }else {
  //       resolve(data);
  //     }
  //   })
  // };
  // const p = Promise.resolve(
  //   new Promise((resolve, reject) => {
  //     resolve(89999);
  //   })
  // );
  // const p1 = Promise.resolve(2);
  // console.log("p", p);
  // console.log("p1", p1);

  /**
   *
   *  返回一个已拒绝（rejected）的 Promise 对象，拒绝原因为给定的参数
   */
  // Promise.reject = function (reason) {
  //   return new Promise((resolve,reject)=>{
  //     reject(reason);
  //   })
  // }

  // const p1 =  Promise.reject(1);
  // const p2 =  Promise.reject(2);
  // console.log(p1,p2)

  /**
   *1. 返回新的Promise
   *2. 遍历可迭代对象
   *3. 输入的Promise都已经敲定时，返回带有描述每个Promise结果的对象数组
   */
  // Promise.allSettled = function (proms) {
  //   return new Promise((resolve, reject) => {
  //     try {
  //       const results = [];
  //       let count = 0;
  //       let finishCount = 0;
  //       for (const p of proms) {
  //         let index = count;
  //         count++;
  //         Promise.resolve(p).then(
  //           (value) => {
  //             results[index] = {
  //               status: "fulfilled",
  //               value,
  //             };
  //           },
  //           (reason) => {
  //             results[index] = {
  //               status: "rejected",
  //               reason,
  //             };
  //           }
  //         ).finally(()=>{
  //           if (++finishCount === count) {
  //             resolve(results);
  //           }
  //         });
  //       }
  //       if (count === 0) {
  //         resolve(results);
  //       }
  //     } catch (err) {
  //       reject(err);
  //     }
  //   });
  // };

  // Promise.allSettled = function (proms) {
  //   const promsArr = [];
  //   for (const p of proms) {
  //     promsArr.push(
  //       Promise.resolve(p).then(data=>({
  //         status: "fulfilled",
  //         value: data
  //       }),reason=>({
  //         status: "rejected",
  //         reason
  //       }))
  //     )
  //   }
  //   return Promise.all(promsArr);
  // }

  // const p1 = new Promise((resolve,reject)=>{
  //   setTimeout(()=>{
  //     resolve(1);
  //   },1000)
  // });
  // const p2 = Promise.resolve(2);
  // const p3 = Promise.reject(3);
  // const results = Promise.allSettled([p1, p2, p3]).then((res) => {
  //   console.log("res", res);
  // });
  // console.log('results',results)

  /**
   *
   * 哪个Promise先完成（成功或者失败）
   *
   */
  const p1 = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(1);
    }, 500);
  });
  const p2 = Promise.resolve(2);
  const p3 = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(0);
    }, 1500);
  });
  Promise.race = function (proms) {
    return new Promise((resolve, reject) => {
      for (const p of proms) {
        Promise.resolve(p).then(resolve, reject);
      }
    });
  };
  Promise.race([p1, p2, p3]).then((res) => {
    console.log(res);
  });
</script>
